home *** CD-ROM | disk | FTP | other *** search
/ Aminet 34 / Aminet 34 (2000)(Schatztruhe)[!][Dec 1999].iso / Aminet / dev / mui / S3DC.lha / S3DC / S3DC.c < prev    next >
C/C++ Source or Header  |  1999-09-20  |  5KB  |  207 lines

  1. /*        S3DC v1.0
  2.       ( Simple 3D Cube )
  3.  
  4.    (C) 1999 Olivier Croquette
  5.       ocroquette@nordnet.fr
  6.  
  7. */
  8.  
  9.  
  10.  
  11. #define S3DC_NB_POINTS 4 /* number of points, 4 for a cube */
  12. #define S3DC_HEIGHT (1/sqrt(2.0))
  13.  
  14. #include <stdio.h>
  15.  
  16. #include "S3DC.h"
  17.  
  18. extern struct GfxBase *GfxBase;
  19. extern struct IntuitionBase *IntuitionBase;
  20. extern struct Library  *MUIMasterBase;
  21.  
  22.  
  23. #include <math.h>
  24.  
  25.  
  26. int S3DC_Convert_Coord(double data, double max, int direction, Object *obj);
  27.  
  28.  
  29. /* Convert coord. to window coord. */
  30. #define S3DC_DIR_X 1
  31. #define S3DC_DIR_Y 2
  32. int S3DC_Convert_Coord(double data, double max, int direction, Object *obj)
  33. {
  34.   switch ( direction )
  35.   {
  36.     case S3DC_DIR_X:
  37.       return((int)( (data/max)*_width(obj)/2 + (_mleft(obj)+_mright(obj))/2 ) );
  38.     case S3DC_DIR_Y:
  39.       return((int)( (data/max)*_height(obj)/2 + (_mbottom(obj)+_mtop(obj))/2 ) );
  40.     default :
  41.       return(-1);
  42.   }
  43. }
  44.  
  45.  
  46.  
  47. ULONG S3DC_AskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
  48. {
  49.   DoSuperMethodA(cl,obj,(Msg)msg);
  50.  
  51.   msg->MinMaxInfo->MinWidth += MIN_WIDTH;
  52.   msg->MinMaxInfo->DefWidth += DEFAULT_WIDTH;
  53.   msg->MinMaxInfo->MaxWidth += MAX_WIDTH;
  54.  
  55.   msg->MinMaxInfo->MinHeight += MIN_HEIGHT;
  56.   msg->MinMaxInfo->DefHeight += DEFAULT_HEIGHT;
  57.   msg->MinMaxInfo->MaxHeight += MAX_HEIGHT;
  58.  
  59.   return(0);
  60. }
  61.  
  62.  
  63. ULONG S3DC_Draw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
  64. {
  65.   struct S3DC_Data *data = INST_DATA(cl,obj);
  66.   float x,y;
  67.   int xcenter, ycenter;
  68.  
  69.   S3DC_Coord bottom[S3DC_NB_POINTS];
  70.   S3DC_Coord top[S3DC_NB_POINTS];
  71.  
  72.   int i;
  73.  
  74.   DoSuperMethodA(cl,obj,(Msg)msg);
  75.  
  76.   if (msg->flags & MADF_DRAWOBJECT || msg->flags & MADF_DRAWUPDATE)
  77.   {
  78.     SetAPen(_rp(obj),data->BlackPen);
  79.     RectFill(_rp(obj),_mleft(obj),_mtop(obj),_mright(obj),_mbottom(obj));
  80.  
  81.     xcenter=(_mright(obj)+_mleft(obj))/2;
  82.     ycenter=(_mtop(obj)+_mbottom(obj))/2;
  83.  
  84.     for ( i=0; i< S3DC_NB_POINTS; i++)
  85.     {
  86.       x = cos(data->theta+i*2*M_PI/S3DC_NB_POINTS);
  87.       y = sin(data->phi)*sin(data->theta+i*2*M_PI/S3DC_NB_POINTS)-cos(data->phi)*S3DC_HEIGHT;
  88.  
  89.       bottom[i].x=S3DC_Convert_Coord(x,2.0,S3DC_DIR_X,obj);
  90.       bottom[i].y=S3DC_Convert_Coord(y,2.0,S3DC_DIR_Y,obj);
  91.  
  92.       x = cos(data->theta+2*i*M_PI/S3DC_NB_POINTS);
  93.       y = sin(data->phi)*sin(data->theta+i*2*M_PI/S3DC_NB_POINTS)+cos(data->phi)*S3DC_HEIGHT;
  94.  
  95.       top[i].x=S3DC_Convert_Coord(x,2.0,S3DC_DIR_X,obj);
  96.       top[i].y=S3DC_Convert_Coord(y,2.0,S3DC_DIR_Y,obj);
  97.     }
  98.  
  99.     SetAPen(_rp(obj),data->WhitePen);
  100.  
  101.     for ( i=0; i<S3DC_NB_POINTS; i++ )
  102.     {
  103.       Move(_rp(obj),bottom[i].x, bottom[i].y);
  104.       if ( i != S3DC_NB_POINTS-1 )
  105.         Draw(_rp(obj),bottom[i+1].x, bottom[i+1].y);
  106.       else
  107.         Draw(_rp(obj),bottom[0].x, bottom[0].y);
  108.  
  109.       Move(_rp(obj),top[i].x, top[i].y);
  110.       if ( i != S3DC_NB_POINTS-1 )
  111.         Draw(_rp(obj),top[i+1].x, top[i+1].y);
  112.       else
  113.         Draw(_rp(obj),top[0].x, top[0].y);
  114.     }
  115.  
  116.     for ( i=0; i< S3DC_NB_POINTS; i++ )
  117.     {
  118.       Move(_rp(obj),bottom[i].x, bottom[i].y);
  119.       Draw(_rp(obj),top[i].x, top[i].y);
  120.     }
  121.  
  122.   }
  123.  
  124.   return(0);
  125.  
  126. }
  127.  
  128.  
  129. /* init data & allocate pens */
  130. ULONG S3DC_Setup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  131. {
  132.   struct S3DC_Data *data = INST_DATA(cl,obj);
  133.  
  134.   if (!(DoSuperMethodA(cl,obj,(Msg)msg)))
  135.     return(FALSE);
  136.  
  137.   MUI_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY);
  138.  
  139.   data->BlackPen = ObtainBestPen(_screen(obj)->ViewPort.ColorMap, 0,0,0,TAG_DONE);
  140.   data->WhitePen = ObtainBestPen(_screen(obj)->ViewPort.ColorMap, 0xFFFFFFFF
  141.                 , 0xFFFFFFFF
  142.                 , 0xFFFFFFFF,TAG_DONE);
  143.   data->phi   =0.101;
  144.   data->theta =0.101;
  145.  
  146.  return(TRUE);
  147. }
  148.  
  149.  
  150. ULONG S3DC_Cleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  151. {
  152.  struct S3DC_Data *data = INST_DATA(cl,obj);
  153.  struct MUIP_Setup *smsg;
  154.  struct Screen *scr;
  155.  struct ColorMap *cmap;
  156.  
  157.  smsg = (struct MUIP_Setup *)msg;
  158.  scr = smsg->RenderInfo->mri_Screen;
  159.  cmap = scr->ViewPort.ColorMap;
  160.  
  161.  ReleasePen(_screen(obj)->ViewPort.ColorMap,data->BlackPen);
  162.  ReleasePen(_screen(obj)->ViewPort.ColorMap,data->WhitePen);
  163.  
  164.  MUI_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY);
  165.  
  166.  
  167.  return(DoSuperMethodA(cl,obj,(Msg)msg));
  168. }
  169.  
  170.  
  171. ULONG S3DC_HandleInput(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  172. {
  173.   #define _between(a,x,b) ((x)>=(a) && (x)<=(b))
  174.   #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright(obj)) && _between(_mtop(obj),(y),_mbottom(obj)))
  175.  
  176.   struct S3DC_Data *data = INST_DATA(cl,obj);
  177.  
  178.   if (msg->muikey!=MUIKEY_NONE)
  179.   {
  180.     switch (msg->muikey)
  181.     {
  182.       case MUIKEY_UP : data->phi+=0.05; MUI_Redraw(obj,MADF_DRAWUPDATE); break;
  183.       case MUIKEY_DOWN : data->phi-=0.05; MUI_Redraw(obj,MADF_DRAWUPDATE); break;
  184.       case MUIKEY_RIGHT : data->theta+=0.05; MUI_Redraw(obj,MADF_DRAWUPDATE); break;
  185.       case MUIKEY_LEFT : data->theta-=0.05; MUI_Redraw(obj,MADF_DRAWUPDATE); break;
  186.  
  187.     }
  188.   }
  189.   return(DoSuperMethodA(cl,obj,(Msg)msg));
  190. }
  191.  
  192.  
  193. ULONG S3DC_Dispatcher(struct IClass *cl __asm("a0"),Object *obj __asm("a2"),Msg msg __asm("a1"))
  194. {
  195.   switch (msg->MethodID)
  196.   {
  197.     case MUIM_AskMinMax : return(S3DC_AskMinMax (cl,obj,(APTR)msg));
  198.     case MUIM_Draw  : return(S3DC_Draw  (cl,obj,(APTR)msg));
  199.     case MUIM_HandleInput: return(S3DC_HandleInput(cl,obj,(APTR)msg));
  200.     case MUIM_Setup  : return(S3DC_Setup  (cl,obj,(APTR)msg));
  201.     case MUIM_Cleanup : return(S3DC_Cleanup (cl,obj,(APTR)msg));
  202.   }
  203.  
  204.   return(DoSuperMethodA(cl,obj,(Msg)msg));
  205. }
  206.  
  207.